package jnBase
{
	import jnBase.eventdispatcher.JNEventDispatcher;
	
	import laya.ani.bone.Skeleton;
	import laya.components.Script;
	import laya.display.Animation;
	import laya.display.Sprite;
	import laya.events.Event;
	import laya.ui.Box;
	import laya.ui.Image;
	import laya.utils.Browser;
	import laya.utils.Handler;
	
	public class BaseZhishi extends Script
	{
		public var zhishiArrow:Animation;
		public var zhishiRect:Image;
		public var mleft:Image;
		public var mright:Image;
		public var mup:Image;
		public var mdown:Image;
		public var zhishiBox:Box;
		private var isShowMouse:Boolean;
		private var isLoop:Boolean;
		public var mouse_icon:Image;
		private var _owner:*;
		public var createBoxInterval:Number = 1000;
		private var _time:Number=0;
		public function BaseZhishi()
		{
			super();
		}
		
		override public function onAwake():void
		{
			// TODO Auto Generated method stub
			super.onAwake();
			_owner=owner as InsPages;
			initZhishi();
		}
		/**
		 *取出正确的工具并执行指定的方法 
		 * @param $tip
		 * @param $value
		 * @param $fun
		 * @param $args
		 * 
		 */		
		public function tishiTools($tip:String,$value:String,$fun:Function,$args:Array=null):void{
			JNEventDispatcher.getInstance().once(JNEventDispatcher.CHOOSE_TOOLS_RIGHT,_owner,$fun,$args);
			JNEventDispatcher.getInstance().event(JNEventDispatcher.INeedTools,[$value,$tip]);
		}
		/**
		 *初始化指示信息 
		 * 
		 */		
		private function initZhishi():void
		{
			// TODO Auto Generated method stub
			zhishiBox=_owner.getChildByName("box_zhishi") as Box;
			zhishiArrow=zhishiBox.getChildByName("ani_arrow") as Animation;
			zhishiRect=zhishiBox.getChildByName("img_rect") as Image;
			mleft=zhishiBox.getChildByName("mleft") as Image;
			mright=zhishiBox.getChildByName("mright") as Image;
			mup=zhishiBox.getChildByName("mup") as Image;
			mdown=zhishiBox.getChildByName("mdown") as Image;
			zhishiArrow.visible=zhishiRect.visible=mleft.visible=mright.visible=mup.visible=mdown.visible=false;
			zhishiBox.mouseThrough=true;
			zhishiArrow.mouseEnabled=false;
			zhishiArrow.mouseThrough=true;
		}
		
		override protected function _onDisable():void
		{
			// TODO Auto Generated method stub
			super._onDisable();
			hideAll();
			removeAllHandler();
		}
		public function removeAllHandler():void{
			zhishiRect.offAll(Event.CLICK);
			zhishiRect.offAll(Event.MOUSE_DOWN);
		}
		
		/**
		 *点击并播放  2.0新的clickAndPlay方法，区别是：1.跟随鼠标的图片是场景中UI的实例变量，2.参数的位置有所调整
		 * @param $sk 要操作的龙骨动画
		 * @param $nameOrIndex  龙骨动画的索引
		 * @param $x 指示箭头的x
		 * @param $y 指示箭头的y	
		 * @param $lx 黄色区域的x
		 * @param $ly 黄色区域的y
		 * @param $tip 提示信息
		 * @param $mouse 跟随鼠标的图片
		 * @param $start 播放的开始帧
		 * @param $showLine	是否显示黄色线框
		 * @param $rectWid 黄色线框的宽
		 * @param $rectHeg 黄色线框的高
		 *
		 * 
		 */		
		public function clickAndPlay($sk:Skeleton,$nameOrIndex:*,$x:int,$y:int,$lx:Number,$ly:Number,$tip:String="",$mouse:*=null,$start:int=0,$showLine:Boolean=true,$rectWid:int=60,$rectHeg:int=60,$clickEndHandler:Handler=null):void{
			if(!($mouse is String)) showMouse($mouse);
			else showMouseByUrl($mouse);
			showZhishi($x,$y);
			showLine($lx,$ly,$rectWid,$rectHeg);
			if($showLine){
				setLoop();
			}
			else{
				zhishiRect.alpha=0;
			}
			if($tip.length>0) showTips($tip);
			zhishiRect.once(Event.CLICK,this,function():void{
				if($clickEndHandler) $clickEndHandler.run();
				hideAll();
				$sk.play($nameOrIndex,false,true,$start);
			});
		}
		/**
		 *点击并播放扩展 原基础加了$showArrow 是否显示箭头指示  2.0新的clickAndPlay方法，区别是：1.跟随鼠标的图片是场景中UI的实例变量，2.参数的位置有所调整
		 * @param $sk 要操作的龙骨动画
		 * @param $nameOrIndex  龙骨动画的索引
		 * @param $x 指示箭头的x
		 * @param $y 指示箭头的y	
		 * @param $lx 黄色区域的x
		 * @param $ly 黄色区域的y
		 * @param $tip 提示信息
		 * @param $mouse 跟随鼠标的图片
		 * @param $start 播放的开始帧
		 * @param $showLine	是否显示黄色线框
		 * @param $showArrow 是否显示箭头指示
		 * @param $rectWid 黄色线框的宽
		 * @param $rectHeg 黄色线框的高
		 *
		 * 
		 */		
		public function clickAndPlayEx($sk:Skeleton,$nameOrIndex:*,$x:int,$y:int,$lx:Number,$ly:Number,$tip:String="",$mouse:*=null,$start:int=0,$showLine:Boolean=true,$showArrow:Boolean=true,$rectWid:int=60,$rectHeg:int=60,$clickEndHandler:Handler=null):void{
			if(!($mouse is String)) showMouse($mouse);
			else showMouseByUrl($mouse);
			if($showArrow){
				showZhishi($x,$y);
			}
			showLine($lx,$ly,$rectWid,$rectHeg);
			if($showLine){
				setLoop();
			}
			else{
				zhishiRect.alpha=0;
			}
			if($tip.length>0) showTips($tip);
			zhishiRect.once(Event.CLICK,this,function():void{
				if($clickEndHandler) $clickEndHandler.run();
				hideAll();
				$sk.play($nameOrIndex,false,true,$start);
			});
		}
		/**
		 *点击并播放 1.0里面的老的clickAndPlay方法  跟随鼠标的是图片的地址，因为老项目有些是直接复制的，所有保留此方法
		 * @param $sk 要操作的龙骨动画
		 * @param $nameOrIndex  龙骨动画的索引
		 * @param $x 指示箭头的X值
		 * @param $y 指示箭头的Y值
		 * @param $mouseUrl 跟随鼠标的图片地址
		 * @param $px	跟随鼠标的图片锚点X
		 * @param $py	跟随鼠标的图片锚点Y
		 * @param $showLine 是否显示黄色框
		 * @param $rectWid 黄色框的宽
		 * @param $rectHeg 黄色框的高
		 * 
		 */		
		public function clickAndPlayByUrl($sk:Skeleton,$nameOrIndex:*,$tip:String,$x:int,$y:int,$mouseUrl:String,$px:int,$py:int,$start:int=0,$showLine:Boolean=true,$rectWid:int=60,$rectHeg:int=60,$rot:int=0):void{
			if($mouseUrl.length>0) showMouseByUrl($mouseUrl,$px,$py,$rot);
			showZhishi($x,$y);
			showLine($x,$y,$rectWid,$rectHeg);
			if($showLine){
				setLoop();
			}
			else{
				zhishiRect.alpha=0;
			}
			if($tip.length>0) showTips($tip);
			zhishiRect.once(Event.CLICK,this,function():void{
				clearLoop();
				hideLine();
				hideMouse();
				hideZhishi();
				$sk.play($nameOrIndex,false,true,$start);
			});
		}

		/**
		 *箭头和线框指示，指示完再点击线框后触发一个方法。 
		 * @param $lx 黄色线框 的x
		 * @param $ly 黄色线框 的y
		 * @param $lw 黄色线框的宽
		 * @param $lh 黄色线框的高
		 * @param $zx 指示箭头的x
		 * @param $zy 指示箭头的y
		 * @param $fun 点击后触发的方法
		 * @param $tips 提示信息
		 * 
		 */		
		public function zhishiAndClick($lx:Number,$ly:Number,$lw:Number,$lh:Number,$zx:Number,$zy:Number,$fun:Function,$tips:String=""):void{
			if($tips.length>0) showTips($tips);
			showLine($lx,$ly,$lw,$lh);
			showZhishi($zx,$zy);
			zhishiRect.once(Event.CLICK,owner,$fun);
			setLoop();
		}
		/**
		 * 线框指示，点击线框后触发一个方法。 
		 * @param $lx 黄色线框 的x
		 * @param $ly 黄色线框 的y
		 * @param $lw 黄色线框的宽
		 * @param $lh 黄色线框的高
		 * @param $fun 点击后触发的方法
		 * @param $tips 提示信息
		 * 
		 */		
		public function xiankuangClick($lx:Number,$ly:Number,$lw:Number,$lh:Number,$fun:Function,$tips:String=""):void{
			if($tips.length>0) showTips($tips);
			showLine($lx,$ly,$lw,$lh);
			zhishiRect.once(Event.CLICK,owner,$fun);
			setLoop();
		}
		/**
		 *隐藏所有指示，不包括提示语音 
		 * 
		 */		
		public function hideAllZhishi():void{
			clearLoop();
			hideZhishi();
			hideLine();
			hideMouse();
		}
		/**
		 *隐藏所有指使信息，包括语音 
		 * 
		 */		
		public function hideAll():void{
			hideMouse();
			hideTips();
			clearLoop();
			hideZhishi();
			hideLine();
			mleft.visible=mright.visible=mup.visible=mdown.visible=false;
		}
		/**
		 *提示信息 
		 * @param str
		 * @param bAutoHide
		 * @param interval
		 * 
		 */		
		public function showTips(str:String,bAutoHide:Boolean=false,interval:int=5000):void{
			JNEventDispatcher.getInstance().event(JNEventDispatcher.SHOW_TIPS,[str,bAutoHide,interval]);
		}
		public function hideTips():void{
			JNEventDispatcher.getInstance().event(JNEventDispatcher.HIDE_TIPS);
		}
		/**
		 *显示鼠标跟随 
		 * @param $url  跟随鼠标的图片url
		 * @param $px	图片的中心点x
		 * @param $py	图片的中心点y
		 * 
		 */		
		public function showMouseByUrl($url:String="",$px=null,$py=null,$rot:Number=0):void{
			if($url.length>0){
				if(mouse_icon==null){
					mouse_icon=new Image();
					_owner.addChild(mouse_icon);
					mouse_icon.pos(1920,1080);
				}
				mouse_icon.visible=false;
				mouse_icon.skin=$url;
				mouse_icon.pivotX=$px;
				mouse_icon.pivotY=$py;
				mouse_icon.rotation=$rot;
				mouse_icon.scale(1,1);
				mouse_icon.alpha=1;
			}
			isShowMouse=true;
		}
		
		public function showMouse($img:Image):void{
			mouse_icon=$img;
			isShowMouse=true;
		}
		/**
		 *初始化龙骨动画，如果已经加载，则不再加载，如果没有加载，则重新加载 
		 * @param $sk  需要操作的龙骨动画实例
		 * @param $url 龙骨动画url
		 * @param han 龙骨动画加载完后执行的方法
		 * 
		 */		
		public function resetSkeleton($sk:Skeleton,$url,han:Handler):void{
			if($sk.templet){
				han.run();
			}
			else{
				$sk.load($url,han);
			}
		}
		private var t:int=0;
		override public function onUpdate():void
		{
			// TODO Auto Generated method stub
			super.onUpdate();
			if(isShowMouse){
				if(mouse_icon) {
					mouse_icon.visible=true;
					mouse_icon.pos((mouse_icon.parent as Sprite).mouseX,(mouse_icon.parent as Sprite).mouseY);
				}
			}
			else{
				if(mouse_icon) {
					mouse_icon.pos(GameConfig.width,GameConfig.height);
					mouse_icon.visible=false;
				}
			}
			if(isLoop){
				var now:* = Browser.now();
				if (now - this._time > this.createBoxInterval) {
					this._time = now;
					(_owner as InsPages).lineLoop();
				}
			}
		}
		/**
		 *隐藏鼠标跟随 
		 * 
		 */		
		public function hideMouse():void{
			isShowMouse=false;
		}
		/**
		 *开始闪动动画 
		 * 
		 */		
		public function setLoop():void{
			_time=Browser.now();
			isLoop=true;
		}
		/**
		 *停止闪动动画 
		 * 
		 */		
		public function clearLoop():void{
			isLoop=false;
		}
		/**显示指示箭头*/
		public function showZhishi($px:Number=0,$py:Number=0):void{
			zhishiArrow.pos($px,$py);
			zhishiArrow.visible=true;
			zhishiArrow.play();
		}
		/***隐藏指示箭头*/
		public function hideZhishi():void{
			zhishiArrow.visible=false;
			zhishiArrow.stop();
		}
		/**
		 *设置黄色方框线 
		 * @param xx
		 * @param yy
		 * @param wid
		 * @param heg
		 * 
		 */		
		public function showLine(xx:Number=null,yy:Number=null,wid:Number=60,heg:Number=60,rot:Number=0):void{
			if(xx && yy && wid && heg){
				zhishiRect.pos(xx,yy);
				zhishiRect.size(wid,heg);
			}
			zhishiRect.rotation=rot;
			zhishiRect.visible=true;
		}
		/**
		 *隐藏黄色方框线 
		 * 
		 */		
		public function hideLine():void{
			zhishiRect.visible=false;
		}
		
	}
}